iT邦幫忙

2026 iThome 鐵人賽

0
JavaScript

30天從零打造醫療資訊小系統系列 第 14 篇

Day 17|第一次使用 JDBC 查詢病患資料:讓 Java 讀取 MySQL

  • 分享至 

  • xImage
  •  

一、從建立資料庫,到真正讀取資料

前幾天,我們已經建立了 medical_system 資料庫,也透過 JDBC 讓 Java 和 MySQL 建立連線。

但是,光是連線成功還不夠。

如果要讓醫療資訊系統顯示病患資料,我們還需要讓 Java 執行 SQL,從資料庫中取得需要的內容。

今天的目標就是:使用 Java 查詢 MySQL 裡的病患資料。

二、先確認資料表裡有資料

還記得之前建立的 patient 資料表嗎?

USE medical_system;
SELECT * FROM patient;

如果之前有新增測試資料,就能看到病患的編號、姓名、性別、生日和電話。

如果資料表是空的,可以先新增一筆測試資料:

INSERT INTO patient (name, gender, birthday, phone)
VALUES ('測試病患', '男', '2006-01-21', '0912345678');

這些都是虛構的測試資料,實作時不要使用真實病患的個人資訊。

三、認識 JDBC 查詢需要的工具

Java 查詢資料時,會用到幾個常見的物件:

  • Connection:負責與資料庫建立連線。
  • PreparedStatement:負責準備 SQL 並執行查詢。
  • ResultSet:負責接收及讀取查詢結果。

它們的關係可以理解成:

Java
↓
Connection
↓
PreparedStatement
↓
執行 SELECT
↓
ResultSet
↓
讀取病患資料

四、建立查詢程式

沿用 Day 16 建立的 DBConnection.java,我們另外建立一個 TestPatientQuery.java。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import util.DBConnection;
public class TestPatientQuery {
public static void main(String[] args) {
String sql = "SELECT id, name, gender, birthday, phone "
+ "FROM patient";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()
) {
while (rs.next()) {
System.out.println("編號:" + rs.getInt("id"));
System.out.println("姓名:" + rs.getString("name"));
System.out.println("性別:" + rs.getString("gender"));
System.out.println("生日:" + rs.getDate("birthday"));
System.out.println("電話:" + rs.getString("phone"));
System.out.println("--------------------");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

記得將 util.DBConnection 改成自己專案裡實際使用的套件名稱。

五、看懂這段程式

  1. 撰寫 SQL

String sql = "SELECT id, name, gender, birthday, phone FROM patient";

這段 SQL 代表從 patient 資料表取得指定欄位。

如果只想取得病患姓名,也可以寫:

SELECT name FROM patient;

實際開發時,指定需要的欄位通常比一律使用 SELECT * 更容易維護。

  1. 執行查詢

PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();

executeQuery() 用於執行會回傳查詢結果的 SQL,例如 SELECT。

  1. 逐筆讀取結果

while (rs.next()) {
System.out.println(rs.getString("name"));
}

rs.next() 會移動到下一筆查詢結果。

只要還有資料,它就會回傳 true;沒有下一筆資料時,就會回傳 false。

因此,如果資料表有三筆病患資料,這段迴圈就會依序讀取三筆。

六、為什麼使用 PreparedStatement?

即使目前的 SQL 沒有輸入參數,我們仍然可以先使用 PreparedStatement,為後續的查詢條件做準備。

例如,未來如果要查詢特定病患,就可以使用:

String sql = "SELECT * FROM patient WHERE id = ?";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setInt(1, 1);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
}
}

其中的 ? 是參數位置,ps.setInt(1, 1) 代表將第一個參數設定為整數 1。

這種寫法可以正確處理輸入值,也有助於防止 SQL Injection。查詢使用者輸入的資料時,應優先使用參數化 SQL,而不是直接把輸入內容串進 SQL 字串。

七、如果查不到資料怎麼辦?

如果程式沒有印出任何病患資料,不一定代表程式出錯。

可能的原因包括:

  1. patient 資料表還沒有資料。
  2. 連接到的資料庫不是預期的 medical_system。
  3. SQL 查詢條件沒有符合任何資料。
  4. 資料庫連線或權限發生問題。

可以先回到 MySQL 執行:

SELECT * FROM patient;

確認資料是否存在,再檢查 Java 的連線設定。

今日小結

今天我們完成了 Java 與 MySQL 的第一次資料查詢,學會使用 PreparedStatement 執行 SQL,再透過 ResultSet 逐筆讀取資料。

目前資料仍然只會顯示在 Console,還沒有出現在網頁上。

Day 17 完成!

下一篇,我們要反過來操作:不只讀取資料,而是讓 Java 將新的病患資料寫進 MySQL。

參考資料:MySQL Connector/J 官方文件


上一篇
Day 16|讓 Java 連上 MySQL:第一次使用 JDBC
下一篇
Day 18|讓 Java 新增病患資料:第一次使用 INSERT INTO
系列文
30天從零打造醫療資訊小系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言